/************************************************************************
 * Este archivo, representa todo lo relacionado a la interfaz para 
 * el egreso de un cliente y cobro por el servicio prestado.
 * 
 * @system: veco-system
 * @description: Sistema de control vehicular
 * @version: 1.0
 * @Copyright © 2013 
 * 
 * @authores:
 * 
 *      > Alberione, Fernando    <falberione_037@gmail.com>
 * 
 *      > Boretto, Martin        <martinboretto@gmail.com>
 * 
 *      > Lenarduzzi, Federico   <fedeatenas@gmail.com>
 * 
 *      > Ocampo, Emanuel        <eocampo86@gmail.com>
 *
 *************************************************************************/

package Interfaces;


import SistemaCocheras.manejadorCaja;
import SistemaCocheras.manejadorCliente;
import SistemaCocheras.manejadorCochera;
import SistemaCocheras.manejadorEstadia;
import SistemaCocheras.manejadorUsuarioAdmin;
import SistemaCocheras.manejadorVehiculo;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;


public class marcarSalida extends javax.swing.JFrame {

    private String dominio = "";
    private Connection conexion = null;
    private sistemaPrincipal sistPrincipal = null;
    private String usuarioActual = "";
    private Boolean campoBotonTarifa = false;

    // ---------------------------------------------------------
    // ------- Seccion de constructores de la clase
    // --------------------------------------------------------- 
    
    /**
    * Constructor vacio
    */
    public marcarSalida() {
        initComponents();
        centrarJFrame();
    }// Fin marcarSalida

   
  /**
   * Metodo encargado de crear el frame "Salida de vehiculo"
   * @param con Representa la conexion con la base de datos
   * @param sp Representa al frame del sistema principal...
   * @param usuario Representa el usuario esta operando el sistema
   * @throws SQLException
   */
   public marcarSalida(Connection con, sistemaPrincipal sp, String usuario) throws SQLException {
        initComponents();
        centrarJFrame();
        this.conexion = con;
        this.sistPrincipal = sp;
        this.usuarioActual = usuario;
        manejadorUsuarioAdmin mua = new manejadorUsuarioAdmin(this.conexion);
        if (!mua.esAdministrador(this.usuarioActual)) {      //
            checkBotonDescuento.setEnabled(false);           // Control de tarifa personalizada
        }                                                    //
    }// Fin marcarSalida

   /**
    * Metodo encargado de crear el frame "Salida de vehiculo"
    * @param con Representa la conexion con la base de datos
    * @param sp Representa al frame del sistema principal
    * @param usuario Representa el usuario que esta operando el sistema
    * @param dominio Representa la patente del cliente que va a egresar
    * @throws SQLException
    */ 
    public marcarSalida(Connection con, sistemaPrincipal sp, String usuario, String dominio) throws SQLException {
        initComponents();
        centrarJFrame();
        this.conexion = con;
        this.sistPrincipal = sp;
        this.usuarioActual = usuario;
        manejadorUsuarioAdmin mua = new manejadorUsuarioAdmin(this.conexion);
        if (!mua.esAdministrador(this.usuarioActual)) {        //
            checkBotonDescuento.setEnabled(false);             // Control de tarifa personalizada
        }                                                      //
        campoTextoDominio.setText(dominio);
    }// Fin marcarSalida
    
    
    /** Este metodo es llamado desde el constructor para 
     * inicializar el form.
     * CUIDADO: NO modifique este codigo. El contenido de este metodo
     * es siempre regenerado por el editor de form.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        botonCancelar = new javax.swing.JButton();
        botonAceptar = new javax.swing.JButton();
        campoTextoDominio = new javax.swing.JTextField();
        labelDominio = new javax.swing.JLabel();
        checkBotonDescuento = new javax.swing.JCheckBox();
        campoTextoDescuento = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("B&B - Salida de vehiculo");
        setResizable(false);

        botonCancelar.setText("Cancelar");
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        botonAceptar.setText("Aceptar");
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        labelDominio.setText("Dominio del Vehiculo (*):");

        checkBotonDescuento.setText("Tarifa personalizada ($ por Hora):");
        checkBotonDescuento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                checkBotonDescuentoActionPerformed(evt);
            }
        });

        campoTextoDescuento.setText("0");
        campoTextoDescuento.setEnabled(false);
        campoTextoDescuento.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoTextoDescuentoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 81, Short.MAX_VALUE)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(checkBotonDescuento)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoTextoDescuento, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(labelDominio)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoTextoDominio, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE)))
                .addContainerGap())
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {botonAceptar, botonCancelar});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDominio)
                    .addComponent(campoTextoDominio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 27, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoTextoDescuento, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(checkBotonDescuento))
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonAceptar)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {botonAceptar, botonCancelar});

        pack();
    }// </editor-fold>//GEN-END:initComponents

 
    // ---------------------------------------------------------
    // ------- Seccion de metodos privados
    // ---------------------------------------------------------     
    
    
    /**
     * Metodo encargado de registrar la salida de un vehiculo satisfactoriamente
     * @param evt Evento que representa el click en el boton Aceptar
     * @throws Exception
     */
    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        this.dominio = campoTextoDominio.getText().toUpperCase();
        manejadorVehiculo mv = new manejadorVehiculo(this.conexion);
        manejadorEstadia me = new manejadorEstadia(this.conexion); //
        manejadorCochera mco = new manejadorCochera(this.conexion);
        this.campoBotonTarifa = this.checkBotonDescuento.isSelected();
        if (mv.esPatenteValida(dominio)) {
            // Se evalua que el dominio ingresado sea el correcto: 'ABC123'
            try {
                if (mv.buscarVehiculoPorDominio(this.dominio).next()) {
                    String fecha = me.calcularFecha();
                    String hora = me.calcularHora();
                    double monto = 0.0;
                    String nuevaTarifaPorHora = "";
                    ResultSet estaEnLaCochera = me.buscarEstadia(this.dominio);
                    if (estaEnLaCochera.next()) {
                        Double[] tarifaPersonalizada = mco.obtenerMontoTarifa(Integer.parseInt(estaEnLaCochera.getString("tipovehiculo"))); //
                        if (this.campoBotonTarifa) {
                            // Control de salida de vehiculos con tarifa personalizada
                            nuevaTarifaPorHora = this.campoTextoDescuento.getText();
                            tarifaPersonalizada[0] = Double.parseDouble(nuevaTarifaPorHora) / 4;        // Quince minutos
                            tarifaPersonalizada[1] = Double.parseDouble(nuevaTarifaPorHora) / 2;        // Media hora
                            tarifaPersonalizada[2] = Double.parseDouble(nuevaTarifaPorHora);            // Hora
                            tarifaPersonalizada[3] = Double.parseDouble(nuevaTarifaPorHora)*24;         // Dia
                            
                            // El resto de las tarifas deberian tomar los valores de la configuracion, debido a que
                            // el monto a pagar, se va demasiado alto
                            // tarifaPersonalizada[4] Es NOCHE, como se calcularia???                   // Noche
                            //tarifaPersonalizada[5] = (Double.parseDouble(nuevaTarifaPorHora)*24)*7;     // Semana
                            //tarifaPersonalizada[6] = (Double.parseDouble(nuevaTarifaPorHora)*24)*15;    // Quincena
                            //tarifaPersonalizada[7] = (Double.parseDouble(nuevaTarifaPorHora)*24)*30;    // Mes
                        }
                        ResultSet vehiculoCliente = mv.buscarVehiculoPorDominioConCliente(this.dominio);
                        if (!vehiculoCliente.next()) {
                            // NO es cliente, por lo que se calcula cuanto se le cobra
                            monto = me.marcarSalida(fecha, hora, this.dominio, tarifaPersonalizada);
                            String tiempoEstadia = me.obtenerTiempoEstadia();
                            manejadorCaja mc = new manejadorCaja(this.conexion);
                            mc.insertarIngreso("Estadia de Vehiculo", this.usuarioActual, monto, fecha, hora);
                            salidaSatisfactoria cartel = new salidaSatisfactoria(this, true);
                            cartel.obtenerValores(this.conexion, this.dominio, estaEnLaCochera, fecha, hora, tarifaPersonalizada, monto, tiempoEstadia);
                            cartel.setVisible(true);
                        } 
                        else {
                            // CLIENTE
                            monto = me.marcarSalidaCliente(fecha, hora, this.dominio);
                            String dniProp = vehiculoCliente.getString(4);
                            manejadorCliente mcl = new manejadorCliente(this.conexion);
                            ResultSet cliente = mcl.buscarClientePorDni(dniProp);
                            cliente.next();
                            String nombre = cliente.getString(2);
                            String apellido = cliente.getString(3);
                            JOptionPane.showMessageDialog(null, " Egreso del cliente: \"" + nombre + " " + apellido + " (" + dniProp + ")\".", "Salida Satisfactoria", JOptionPane.INFORMATION_MESSAGE);
                        }
                        marcarSalida.this.dispose();
                        this.sistPrincipal.actualizarVistaEstadia();
                        this.sistPrincipal.llenarCamposDeTexto();
                        this.sistPrincipal.setVisible(true);
                    } 
                    else {
                        JOptionPane.showMessageDialog(null, " El vehiculo no se encuentra cargado", "Salida Fallida", JOptionPane.ERROR_MESSAGE);
                    }
                } 
                else {
                    // En caso contrario informa que no es un domino valido.
                    JOptionPane.showMessageDialog(null, " El vehículo no se encuentra cargado", "Salida Fallida", JOptionPane.ERROR_MESSAGE);
                }
            }// Fin try 
            catch (Exception ex) {
                JOptionPane.showMessageDialog(null, " Error interno: " + ex, "Salida Fallida", JOptionPane.ERROR_MESSAGE);
            }
        } 
        else {
            JOptionPane.showMessageDialog(null, " El formato del dominio ingresado es incorrecto. Formato correcto: 'ABC123'  ", "Salida Fallida", JOptionPane.ERROR_MESSAGE);
        }
}//GEN-LAST:event_botonAceptarActionPerformed

    
    /**
     * Metodo encargado de cancelar la salida de un vehiculo
     * @param evt Evento que representa el click en el boton Cancelar
     */
    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        marcarSalida.this.dispose();
    }//GEN-LAST:event_botonCancelarActionPerformed

    
    /**
     * Metodo encargado de habilitar la opcion de Descuento
     * @param evt Evento que representa el click en el boton Descuento
     */
    private void checkBotonDescuentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkBotonDescuentoActionPerformed
        if (this.checkBotonDescuento.isSelected()){
            this.campoTextoDescuento.setEnabled(true);
        }
        else{
            this.campoTextoDescuento.setEnabled(false);
        }
}//GEN-LAST:event_checkBotonDescuentoActionPerformed

    
    /**
     * Metodo encargado de 
     * @param evt Evento que representa el click en el boton Descuento
     */
    private void campoTextoDescuentoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoTextoDescuentoActionPerformed

}//GEN-LAST:event_campoTextoDescuentoActionPerformed

    /**
     * Metodo encargado de ubicar el frame en el centro de la pantalla
     */
    private void centrarJFrame(){
        Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frame =this.getSize();
        this.setLocation((pantalla.width-frame.width)/2, (pantalla.height-frame.height)/2);
    } // Fin centrarJFrame


    /**
     * 
     * @param args 
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new marcarSalida().setVisible(true);
            }
        });
    }// Fin main

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JTextField campoTextoDescuento;
    private javax.swing.JTextField campoTextoDominio;
    private javax.swing.JCheckBox checkBotonDescuento;
    private javax.swing.JLabel labelDominio;
    // End of variables declaration//GEN-END:variables

}// Fin clase nuevoUsuario
